var aGoods = { pic: '.', title: '..', desc: `...`, sellNumber: 1, favorRate: 2, price: 3, };
class UIGoods {
    // 总价
    get totalPrice() {
        return this.choose * this.data.price
    }
    // 是否选择
    get isChoose() {
        return this.choose > 0
    }
    constructor(g) {
        g = { ...g }; // 拷贝对象
        Object.freeze(g)
        Object.defineProperty(this, 'data', {
            // 读取器：getter
            get: function () {
                return g
            },
            // 设置器：setter
            set: function (value) {
                throw new Error('属性是只读的，不能重新赋值')
            },
            configurable: false, // 不可修改属性描述符本身
        })
        let internalChooseValue = 0; // 默认为0
        Object.defineProperty(this, 'choose', {
            get: function () {
                return internalChooseValue
            },
            set: function (value) {
                if (typeof value !== 'number') throw new Error('choose属性必须是数字');
                const temp = parseInt(value)
                if (value !== temp) throw new Error('choose属性必须是整数');
                if (value < 0) throw new Error('choose属性必须大于等于0');
                internalChooseValue = value
            },
            configurable: false, // 不可修改属性描述符本身
        })
        this.hehe = 'hehe'
        Object.seal(this); // 密封对象
    }
}
// 对象原型冻结
Object.freeze(UIGoods.prototype);
UIGoods.prototype.hh = 'xixi'; // 冻结了对象原型，不可添加属性和方法

// 实例化UIGoods对象
const g = new UIGoods(aGoods)
console.log(g.hh);

// 拷贝冻结原对象不能修改
g.data.price = '100';
console.log(g.data);

g.haha = 'haha'; // 密封对象无法添加新的属性
g.hehe = 'HEHE'; // 密封对象可以修改普通属性
console.log(g);

// 测试写好的方法和属性
g.choose = 2;
console.log(g.totalPrice);
console.log(g.isChoose);






